package com.yzkj.cpjxc.business.framework.utils;

import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;


/**
 * 一个SQL或HQL构成的帮助类
 * SqlHelper对象封装了sql语句以及参数
 * @author Jandy.Chung
 * 
 */
public class SqlHelper {

	private String header = "";
	private StringBuffer condition = new StringBuffer();
	private List<Object> params = new ArrayList<Object>();
	private String footer = "";

	/**
	 * 构造方法
	 * 
	 * @param headerSql
	 *            一般为基本的部分，如：select obj from JavaBean as obj
	 */
	public SqlHelper(String headerSql) {
		header = headerSql;
	}

	/**
	 * 设置SQL或HQL的基本部分
	 * 
	 * @param value
	 *            如：select obj from JavaBean as obj
	 */
	public void setHeader(String value) {
		header = value;
	}

	/**
	 * 得到SQL或HQL的基本部分
	 * 
	 * @return SQL或HQL的基本部分
	 */
	public String getHeader() {
		return header;
	}

	/**
	 * 设置SQL或HQL的条件
	 * 
	 * @param value
	 *            SQL或HQL的条件语句
	 */
	public void setCondition(StringBuffer value) {
		condition = value;
	}

	/**
	 * 得到SQL或HQL的条件
	 * 
	 * @return SQL或HQL的条件语句
	 */
	public StringBuffer getCondition() {
		return condition;
	}

	/**
	 * 设置SQL或HQL的条件参数值
	 * 
	 * @param value
	 *            SQL或HQL的条件参数值
	 */
	public void setParams(List<Object> value) {
		params = value;
	}

	/**
	 * 得到SQL或HQL的条件参数值
	 * 
	 * @return 一个封装SQL或HQL的条件参数值的List接口
	 */
	public List<Object> getParams() {
		return params;
	}

	/**
	 * 以数值形式设置SQL或HQL的参数值
	 * 
	 * @param value
	 *            SQL或HQL的参数值数组
	 */
	public void setParams(Object[] value) {
		for (int i = 0; i < value.length; i++) {
			params.add(value[i]);
		}
	}

	/**
	 * 设置SQL或HQL的附带部分，一般为where语句之后的语句，如：order by,group by,having...
	 * 
	 * @param value
	 */
	public void setFooter(String value) {
		footer = value;
	}

	/**
	 * 得到SQL或HQL的附带部分
	 * 
	 * @return
	 */
	public String getFooter() {
		return footer;
	}

	/**
	 * 以单值形式添加SQL或HQL语句的条件
	 * 
	 * @param conditionSQL
	 *            条件语句
	 * @param param
	 *            条件语句中所用到的参数值
	 */
	public void addAndCondition(String conditionSQL, Object param) {
		if (condition.length() > 0) {
			condition.append(" and ");
		}
		condition.append(" " + conditionSQL.trim());
		params.add(param);
	}

	/**
	 * 以数组形式添加SQL或HQL语句的条件
	 * 
	 * @param conditionSQL
	 *            条件语句
	 * @param param
	 *            条件语句中所用到的参数值数组
	 */
	public void addAndCondition(String conditionSQL, Object[] param) {
		if (condition.length() > 0) {
			condition.append(" and ");
		}
		condition.append(" " + conditionSQL.trim());
		for (int i = 0; i < param.length; i++) {
			params.add(param[i]);
		}
	}

	/**
	 * 添加SQL或HQL语句的条件
	 * 
	 * @param conditionSQL
	 */
	public void addAndCondition(String conditionSQL) {
		if (condition.length() > 0) {
			condition.append(" and ");
		}
		condition.append(conditionSQL.trim());
	}
	
	/**
	 * 
	 * @description: 添加 or 条件
	 */
	public void addOrCondition(String conditionSQL, Object param) {
		if (condition.length() > 0) {
			condition.append(" or ");
		}
		condition.append(" " + conditionSQL.trim());
		params.add(param);
	}

	/**
	 * 得到SQL或HQL的条件语句
	 * 
	 * @return
	 */
	public String getQueryCondition() {
		if (condition.length() > 0) {
			return " where " + condition.toString();
		}
		return "";
	}

	/**
	 * 得到完整的SQL或HQL语句
	 * 
	 * @return
	 */
	public String getSQL() {
		return header + getQueryCondition() + " " + footer;
	}
	
	
	/**
	 * 解释ids
	 * @modifier:
	 * @modifiedDate:
	 * @param s  传入的参数："1,2,3,4,5"
	 * @return  List.get(0)=?,?,?,?,?  List.get(1)=[1, 2, 3, 4, 5]
	 */
	public static List<Object> parseIds(String s) {
		ArrayList<Object> arraylist = new ArrayList<Object>(2);
		String s1 = "";
		ArrayList<Object> arraylist1 = new ArrayList<Object>();
		String as[] = s.split(",");
		for (int i = 0; i < as.length; i++) {
			if (!StringUtils.isBlank(s1)) {
				s1 = (new StringBuilder()).append(s1).append(",").toString();
			}
			s1 = (new StringBuilder()).append(s1).append("?").toString();
			arraylist1.add(as[i]);
		}
		arraylist.add(s1);
		arraylist.add(arraylist1);
		return arraylist;
	}
	
	/**
	 * 将SQL语句变成一条语句，并且每个单词的间隔都是1个空格
	 * 
	 * @param sql SQL语句
	 * @return 如果sql是NULL返回空，否则返回转化后的SQL
	 */
	public static String getLineSql(String sql) {
		return sql.replaceAll("[\r\n]", " ").replaceAll("\\s{2,}", " ");
	}
	
}